package com.hongyi.common.framework.utils;

import com.hongyi.common.framework.utils.spring.SpringUtils;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import java.util.Set;

/**
 * Validator 校验框架工具
 *
 * @author DingHao
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ValidatorUtils {

    //声明一个Validator类型的常量,内容是从Spring容器中获取 Validator类型的Bean
    private static final Validator VALID = SpringUtils.getBean(Validator.class);

    /**
     * 验证对象的方法,并在验证失败时抛出异常
     *
     * @param object    需要验证的对象
     * @param groups    可变参数，表示验证组
     */
    public static <T> void validate(T object, Class<?>... groups) {
        //调用 Validator 的 validate 方法，对传入的对象 object 进行验证
        //返回值是一个 Set<ConstraintViolation<T>> 类型的集合，其中每个 ConstraintViolation 对象表示一个验证失败的信息
        Set<ConstraintViolation<T>> validate = VALID.validate(object, groups);
        //如果校验信息不为空,就将抛出参数校验异常
        if (!validate.isEmpty()) {
            throw new ConstraintViolationException("参数校验异常", validate);
        }
    }

}
